/*
 * Copyright (c) 2024. hallele, Inc All rights reserved.
 */

package cn.hallele.ms.starter.web.framework.context;

import cn.hallele.infrastructure.metadata.io.Equipment;
import cn.hallele.infrastructure.metadata.io.Request;
import cn.hallele.infrastructure.metadata.io.User;
import cn.hallele.infrastructure.util.ObjectUtil;
import cn.hallele.ms.starter.web.framework.bo.ActionOrder;
import cn.hallele.ms.starter.web.framework.service.ActionService;
import com.yomahub.liteflow.flow.LiteflowResponse;
import lombok.Getter;
import lombok.Setter;

import java.util.HashMap;
import java.util.Map;

/**
 * 基础上下文
 *
 * @author anle5
 * @since 2024/12/23 22:44
 */
@Setter
@Getter
public class ActionContext {
    /**
     * 实际要执行的业务chainId，非框架chainId
     */
    private String chainId;

    /**
     * 同步模式？
     */
    private boolean sync;

    /**
     * 订单信息
     */
    private ActionOrder order;

    /**
     * 原始请求信息
     */
    private Request<?> request;

    /**
     * 响应结果
     */
    private Object result;

    /**
     * 逻辑链执行结果
     */
    private LiteflowResponse chainResponse;

    /**
     * 服务端信息
     */
    private Equipment server;

    /**
     * action对应的服务
     */
    private ActionService actionService;

    /**
     * 上下文传递参数
     */
    private static final Map<String, Object> PARAMS = new HashMap<>();

    public void setClient(Equipment client) {
        if (this.request == null) {
            this.request = Request.builder().build();
        }
        this.request.setClient(client);
    }

    /**
     * 获取client信息
     *
     * @return client信息
     */
    public Equipment getClient() {
        if (this.request != null) {
            return this.request.getClient();
        }
        return null;
    }

    /**
     * 获取发起方信息
     *
     * @return 获取发起方信息
     */
    public User getInitiator() {
        if (this.request != null) {
            return this.request.getInitiator();
        }
        return null;
    }

    /**
     * 获取请求内容体
     *
     * @param <T> 泛型
     * @return 请求内容体
     */
    public <T> T getRequestData() {
        if (request != null) {
            return ObjectUtil.cast(request.getData());
        }
        return null;
    }

    /**
     * 获取结果
     *
     * @param <T> 结果类型
     * @return 结果
     */
    public <T> T getResult() {
        return ObjectUtil.cast(this.result);
    }

    /**
     * 设置上下文传递参数
     *
     * @param key   参数key
     * @param value 参数值
     */
    public void setParams(String key, Object value) {
        PARAMS.put(key, value);
    }

    /**
     * 获取上下文传递参数
     *
     * @param key 参数key
     * @return 参数值
     */
    public <T> T getParams(String key) {
        return ObjectUtil.cast(PARAMS.get(key));
    }
}
